#include <stdio.h>
#include <pthread.h>
#include "gpio_init.h" // 存放初始化配置gpio的函数实现
#include "distance.h"  // 存放超声波使用的函数实现
#include "project.h"   // 当前为超声波的距离函数
#include "motor.h"

static void *motor_func(); // 线程函数

float dist; // 超声波测得的距离
int flag;

/*
    功能：通过接收argv[1]中控制窗帘的打开（反转）和关闭（正转）
    <val>:
        1:打开
        2:关闭
*/
int main(int argc, char **argv)
{
    pthread_t motor_pid;
    // 定义电机所用的变量
    char motor_num[6]; // 存放电机的引脚号
    struct gpio_desc gpios;

    if (argc < 2)
    {
        perror("input error");
        exit(-1);
    }
    flag = atoi(argv[1]);

    gpio_init(); // 引脚初始化

    dist = trigger_echo_get(); // 距离

// 配置电机引脚
#if 1
    for (int i = 0; i < 4; i++)
    {
        if (i == 0)
        {
            gpios.group = 4;
            gpios.num[0] = 11;
        }
        else
        {
            gpios.group = 5;
            gpios.num[0] = 11 + i; // 12 13 14
        } // 分配端口
        // 得到设备节点地址
        memset(motor_num, 0, sizeof(motor_num) / sizeof(char));
        sprintf(motor_num, "%d", gpio_get(gpios));
        sprintf(motor_pptr[i], "/sys/class/gpio/gpio%s", motor_num);
        // 配置电机属性文件
        motor_config(motor_pptr[i], motor_num);
    }
#endif

    pthread_create(&motor_pid, NULL, motor_func, NULL);
    usleep(1000000);

    while (1)
    {
        dist = trigger_echo_get(); // 距离
        if (-1 == dist)
        {
            perror("dist is error");
            exit(-1);
        }
        usleep(100000);
    }

    // 线程的汇合
    pthread_join(motor_pid, NULL);

    return 0;
}

static void *motor_func()
{
    while (1)
    {
        if (flag == 1) // 打开窗帘(反转)
        {
            if (dist > 150) // 已打开状态
            {
                motor_stop();
                exit(-1);
            }
            if (dist < 5) // 未打开状态
            {
                motor_Rwv();
            }
        }
        if (flag == 2) // 关闭窗帘(正转)
        {
            if (dist < 5) // 已关闭状态
            {
                motor_stop();
                exit(-1);
            }
            if (dist > 100) // 未关闭状态
            {
                motor_Fwd();
            }
        }
    }

    // while (1)
    // {
    //     if (dist < 10) // 小于1cm
    //     {
    //         // 正转
    //         printf("distance: %.2fcm\n", dist);
    //         motor_Fwd();
    //         if (dist > 10)
    //         {
    //             motor_stop();
    //         }
    //     }
    //     else if (dist > 100) // 其他
    //     {
    //         //
    //         motor_Rwv();
    //         if (dist < 80)
    //         {
    //             motor_stop();
    //         }
    //     }
    // }
}